package com.lcg.imm.mic

import android.content.Context
import android.os.Bundle
import com.iflytek.cloud.RecognizerListener
import com.iflytek.cloud.RecognizerResult
import com.iflytek.cloud.SpeechConstant
import com.iflytek.cloud.SpeechError
import com.iflytek.cloud.SpeechRecognizer
import com.iflytek.cloud.SpeechUtility

/**
 * 语音输入
 *
 * @author lei.chuguang Email:475825657@qq.com
 * @version 1.0
 * @since 2021/1/21 11:51
 */
object Speech {
    private var iat: SpeechRecognizer? = null

    /**初始化*/
    fun init(context: Context) {
        if (iat != null) return
        SpeechUtility.createUtility(context, SpeechConstant.APPID + "=12345")
        iat = SpeechRecognizer.createRecognizer(context) {}?.apply {
            //设置语法ID和 SUBJECT 为空，以免因之前有语法调用而设置了此参数；或直接清空所有参数，具体可参考 DEMO 的示例。
            setParameter(SpeechConstant.CLOUD_GRAMMAR, null)
            setParameter(SpeechConstant.SUBJECT, null)
            //设置返回结果格式，目前支持json,xml以及plain 三种格式，其中plain为纯听写文本内容
            setParameter(SpeechConstant.RESULT_TYPE, "plain")
            //此处engineType为“cloud”
            setParameter(SpeechConstant.ENGINE_TYPE, "cloud")
            //设置语音输入语言，zh_cn为简体中文
            setParameter(SpeechConstant.LANGUAGE, "zh_cn")
            //设置结果返回语言
            setParameter(SpeechConstant.ACCENT, "mandarin")
            // 设置语音前端点:静音超时时间，单位ms，即用户多长时间不说话则当做超时处理
            //取值范围{1000～10000}
            setParameter(SpeechConstant.VAD_BOS, "10000")
            //设置语音后端点:后端点静音检测时间，单位ms，即用户停止说话多长时间内即认为不再输入，
            //自动停止录音，范围{0~10000}
            setParameter(SpeechConstant.VAD_EOS, "2000")
            //设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
            setParameter(SpeechConstant.ASR_PTT, "0")
            setParameter("nunum", "0")
        }
    }

    /**开始识别*/
    fun recognize(listener: Listener) {
        if (iat == null) {
            listener.onBeginOfSpeech()
            listener.onEndOfSpeech()
            listener.onResult("")
        } else {
            iat!!.startListening(object : RecognizerListener {
                override fun onBeginOfSpeech() {
                    // 此回调表示：sdk内部录音机已经准备好了，用户可以开始语音输入
                    listener.onBeginOfSpeech()
                }

                override fun onError(error: SpeechError) {
                    // 错误码：10118(您没有说话)，可能是录音机权限被禁，需要提示用户打开应用的录音权限。
                    listener.onEndOfSpeech()
                    listener.onResult("")
                }

                override fun onEndOfSpeech() {
                    // 此回调表示：检测到了语音的尾端点，已经进入识别过程，不再接受语音输入
                    listener.onEndOfSpeech()
                }

                override fun onResult(results: RecognizerResult, isLast: Boolean) {
                    listener.onResult(results.resultString)
                }

                override fun onVolumeChanged(volume: Int, data: ByteArray) {
//                    showTip("当前正在说话，音量大小：$volume")
                }

                override fun onEvent(eventType: Int, arg1: Int, arg2: Int, obj: Bundle?) {
                    // 以下代码用于获取与云端的会话id，当业务出错时将会话id提供给技术支持人员，可用于查询会话日志，定位出错原因
                    // 若使用本地能力，会话id为null
                    //	if (SpeechEvent.EVENT_SESSION_ID == eventType) {
                    //		String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
                    //		Log.d(TAG, "session id =" + sid);
                    //	}
                }
            })
        }
    }

    fun cancel() {
        iat?.cancel()
    }

    interface Listener {
        fun onBeginOfSpeech()
        fun onEndOfSpeech()
        fun onResult(results: String)
    }
}